package com.example.sms_listener

import android.content.Context
import android.content.Intent
import android.net.Uri
import android.provider.Telephony
import android.telephony.SmsManager
import android.util.Log
import android.content.pm.PackageManager

/**
 * 短信发送管理器
 * 
 * 提供两种发送模式：
 * 1. 后台发送：直接通过系统API发送，需要SEND_SMS权限
 * 2. 系统界面发送：打开系统短信应用发送界面，无需权限
 */
class SmsSendManager {
    
    companion object {
        private const val TAG = "SmsSendManager"
    }
    
    /**
     * 后台发送短信
     * 
     * @param context 上下文
     * @param phoneNumber 接收者手机号码
     * @param message 短信内容
     * @return 发送结果，true表示发送成功启动，false表示发送失败
     */
    fun sendSmsBackground(context: Context, phoneNumber: String, message: String): Boolean {
        return try {
            Log.d(TAG, "开始后台发送短信到: $phoneNumber")
            
            // 验证参数
            if (phoneNumber.trim().isEmpty()) {
                Log.e(TAG, "手机号码为空")
                return false
            }
            
            if (message.trim().isEmpty()) {
                Log.e(TAG, "短信内容为空")
                return false
            }
            
            // 获取SmsManager实例
            val smsManager = SmsManager.getDefault()
            
            // 检查短信长度，如果超过160字符需要分条发送
            val parts = smsManager.divideMessage(message)
            
            if (parts.size == 1) {
                // 单条短信
                Log.d(TAG, "发送单条短信，长度: ${message.length}")
                smsManager.sendTextMessage(
                    phoneNumber.trim(),
                    null,
                    message,
                    null,
                    null
                )
            } else {
                // 多条短信
                Log.d(TAG, "发送多条短信，分为 ${parts.size} 条")
                smsManager.sendMultipartTextMessage(
                    phoneNumber.trim(),
                    null,
                    parts,
                    null,
                    null
                )
            }
            
            Log.d(TAG, "短信发送命令已执行")
            true
        } catch (e: SecurityException) {
            Log.e(TAG, "权限不足，无法发送短信", e)
            false
        } catch (e: IllegalArgumentException) {
            Log.e(TAG, "参数错误", e)
            false
        } catch (e: Exception) {
            Log.e(TAG, "发送短信时发生未知错误", e)
            false
        }
    }
    
    /**
     * 使用系统Intent发送短信
     * 
     * @param context 上下文
     * @param phoneNumber 接收者手机号码（可选）
     * @param message 短信内容（可选）
     * @return 操作结果，true表示成功打开系统短信界面，false表示操作失败
     */
    fun sendSmsWithIntent(context: Context, phoneNumber: String?, message: String?): Boolean {
        return try {
            Log.d(TAG, "使用系统Intent发送短信")
            
            // 创建短信Intent
            val intent = Intent(Intent.ACTION_SENDTO).apply {
                // 设置data为sms URI
                data = if (!phoneNumber.isNullOrEmpty()) {
                    Uri.parse("sms:${phoneNumber.trim()}")
                } else {
                    Uri.parse("sms:")
                }
                
                // 添加短信内容
                if (!message.isNullOrEmpty()) {
                    putExtra("sms_body", message)
                }
                
                // 添加FLAG_ACTIVITY_NEW_TASK以便从非Activity上下文启动
                addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            }
            
            // 检查是否有可用的短信应用
            if (intent.resolveActivity(context.packageManager) != null) {
                context.startActivity(intent)
                Log.d(TAG, "成功打开系统短信发送界面")
                true
            } else {
                Log.e(TAG, "没有找到可用的短信应用")
                false
            }
        } catch (e: Exception) {
            Log.e(TAG, "打开系统短信界面时发生错误", e)
            false
        }
    }
    
    /**
     * 检查设备是否支持短信功能
     * 
     * @param context 上下文
     * @return true表示设备支持短信功能
     */
    fun isSmsAvailable(context: Context): Boolean {
        return try {
            // 检查设备是否有短信功能
            val hasFeature = context.packageManager.hasSystemFeature("android.hardware.telephony")
            
            // 检查是否有可用的短信应用
            val intent = Intent(Intent.ACTION_SENDTO, Uri.parse("sms:"))
            val hasApp = intent.resolveActivity(context.packageManager) != null
            
            Log.d(TAG, "设备短信功能检查 - 硬件支持: $hasFeature, 应用可用: $hasApp")
            
            hasFeature && hasApp
        } catch (e: Exception) {
            Log.e(TAG, "检查短信功能可用性时发生错误", e)
            false
        }
    }
    
    /**
     * 获取默认短信应用包名
     * 
     * @param context 上下文
     * @return 默认短信应用的包名，如果获取失败返回null
     */
    fun getDefaultSmsApp(context: Context): String? {
        return try {
            val packageName = Telephony.Sms.getDefaultSmsPackage(context)
            Log.d(TAG, "默认短信应用: $packageName")
            packageName
        } catch (e: Exception) {
            Log.e(TAG, "获取默认短信应用时发生错误", e)
            null
        }
    }
    
    /**
     * 检查是否为默认短信应用
     * 
     * @param context 上下文
     * @return true表示当前应用是默认短信应用
     */
    fun isDefaultSmsApp(context: Context): Boolean {
        return try {
            val defaultSmsPackage = Telephony.Sms.getDefaultSmsPackage(context)
            val currentPackage = context.packageName
            val isDefault = defaultSmsPackage == currentPackage
            Log.d(TAG, "当前应用是否为默认短信应用: $isDefault")
            isDefault
        } catch (e: Exception) {
            Log.e(TAG, "检查默认短信应用状态时发生错误", e)
            false
        }
    }
    
    /**
     * 获取可用的短信应用列表
     * 
     * @param context 上下文
     * @return 可用短信应用的包名列表
     */
    fun getAvailableSmsApps(context: Context): List<String> {
        return try {
            val intent = Intent(Intent.ACTION_SENDTO, Uri.parse("sms:"))
            val resolveInfos = context.packageManager.queryIntentActivities(intent, 0)
            
            val apps = resolveInfos.map { it.activityInfo.packageName }
            Log.d(TAG, "可用的短信应用: $apps")
            apps
        } catch (e: Exception) {
            Log.e(TAG, "获取可用短信应用时发生错误", e)
            emptyList()
        }
    }
    
    /**
     * 检查短信发送权限
     * 
     * @param context 上下文
     * @return true表示有发送权限
     */
    fun hasSendSmsPermission(context: Context): Boolean {
        return try {
            val permission = android.Manifest.permission.SEND_SMS
            val result = context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED
            Log.d(TAG, "SMS发送权限检查结果: $result")
            result
        } catch (e: Exception) {
            Log.e(TAG, "检查SMS发送权限时发生错误", e)
            false
        }
    }
    
    /**
     * 验证手机号码格式
     * 
     * @param phoneNumber 手机号码
     * @return true表示格式正确
     */
    fun isValidPhoneNumber(phoneNumber: String?): Boolean {
        if (phoneNumber.isNullOrEmpty()) {
            return false
        }
        
        val trimmed = phoneNumber.trim()
        
        // 基本格式检查：只包含数字、加号、减号、空格、括号
        val regex = "^[+\\-\\s()\\d]+$".toRegex()
        
        return trimmed.matches(regex) && trimmed.replace("[^\\d]".toRegex(), "").length >= 4
    }
    
    /**
     * 清理手机号码格式
     * 
     * @param phoneNumber 原始手机号码
     * @return 清理后的手机号码
     */
    fun cleanPhoneNumber(phoneNumber: String): String {
        return phoneNumber.trim()
            .replace("\\s+".toRegex(), "")  // 移除空格
            .replace("-".toRegex(), "")      // 移除短横线
            .replace("\\(|\\)".toRegex(), "") // 移除括号
    }
} 